#REFERENCIA DA BASE DOS DADOS https://opendatasus.saude.gov.br/dataset/srag-2020

#DATA DA ULTIMA ATULIZAÇÃO : 29/11/2022 -ARQUIVO –> SUBSTITUIR ARQ PELO MAIS RECENTE -REORGANIZAR OS GRAFICOS E SERIES

#BIBLIOTECAS

library(dplyr)
library(ggplot2)
library(plotly)
library(scales)
library(lattice)
#importa dados, string vazio como NA, string como fatores
#arquivo = file.choose()
df = read.csv("INFLUD20-17-10-2022Reduzido.csv",
                 sep = ";",
                 na.strings="",
                 stringsAsFactors=TRUE)
#ANALISANDO A BASE DE DADOS
#EXCLUINDO COLUNAS DESNECESSARIAS PARA ANALISE
excluir_col <- c("ID_REGIONA", "CO_REGIONA", "CO_MUN_NOT", "CO_UNI_NOT", "NM_MAE_PAC",
                 "CO_MUN_RES", "CO_PAIS", "ID_RG_RESI", "CO_RG_RESI",
                 "AVE_SUINO", "FEBRE", "TOSSE", "GARGANTA", "DISPNEIA", "DIARREIA", "VOMITO",
                 "DESC_RESP", "SATURACAO", "OUTRO_SIN", "OUTRO_DES", "PUERPERA", "CARDIOPATI",
                 "HEMATOLOGI","DIABETES", "NEUROLOGIC", "PNEUMOPATI", "RENAL", "OUT_MORBI",
                 "SIND_DOWN", "HEPATICA", "ASMA", "IMUNODEPRE", "OBESIDADE", "OBES_IMC",
                 "MORB_DESC", "VACINA", "DT_UT_DOSE", "MAE_VAC", "DT_VAC_MAE", "M_AMAMENTA",
                 "DT_DOSEUNI", "DT_1_DOSE", "DT_2_DOSE", "ANTIVIRAL", "TP_ANTIVIR", "OUT_ANTIV",
                 "DT_ANTIVIR", "ID_RG_INTE", "CO_RG_INTE", "SG_UF_INTE", "ID_MN_INTE", 
                 "CO_MU_INTE", "DT_SAIDUTI", "SUPORT_VEN", "RAIOX_RES", "RAIOX_OUT", "DT_RAIOX",
                 "AMOSTRA", "DT_COLETA", "TP_AMOSTRA", "OUT_AMOST", "DT_ENTUTI", "PCR_RESUL",
                 "DT_PCR", "POS_PCRFLU","TP_FLU_PCR", "PCR_FLUASU", "FLUASU_OUT","PCR_FLUBLI",
                 "FLUBLI_OUT", "POS_PCROUT", "PCR_VSR", "PCR_PARA1", "PCR_PARA2", "PCR_PARA3",
                 "PCR_PARA4", "PCR_ADENO", "PCR_METAP", "PCR_BOCA", "PCR_RINO", "PCR_OUTRO",
                 "DS_PCR_OUT", "CLASSI_FIN", "CLASSI_OUT","CRITERIO", "DT_ENCERRA", "DT_DIGITA",
                 "PCR_SARS2", "PAC_COCBO", "PAC_DSCBO", "OUT_ANIM", "DOR_ABD", "FADIGA",
                 "PERD_OLFT", "PERD_PALA", "TOMO_RES", "DT_TOMO", "DT_RES_AN", "POS_AN_FLU",
                 "TP_FLU_AN", "POS_AN_OUT", "AN_SARS2", "AN_VSR", "AN_PARA1", "AN_PARA2",
                 "AN_PARA3", "AN_ADENO", "AN_OUTRO", "DS_AN_OUT", "TP_AM_SOR", "SOR_OUT",
                 "TOMO_OUT", "RES_AN", "DT_CO_SOR", "TP_SOR", "OUT_SOR", "DT_RES", "RES_IGG",
                 "RES_IGM", "RES_IGA", "COD_IDADE", "CS_ESCOL_N", "CS_GESTANT", "TP_TES_AN",
                 "CS_ZONA", "SURTO_SG", "DT_RT_VGM", "DT_VGM", "PAIS_VGM", "CO_PS_VGM",
                 "LO_PS_VGM", "HISTO_VGM", "SG_UF", "DT_NASC", "ID_UNIDADE", "ID_MN_RESI","UTI",
                 "HOSPITAL","DT_INTERNA", "DT_EVOLUCA"
                 )
df = df[,!(names(df)%in% excluir_col)]

#RACA
#NA's = 9-Ignorado
df[is.na(df$CS_RACA),]$CS_RACA = 9 

#LEG_RACA
#DUPLICANDO COLUNA RACA
df["leg_Raca"]= df$CS_RACA

#SUBSTITUI VALORES
df[df$leg_Raca==1,]$leg_Raca = "Branca"
df[df$leg_Raca==2,]$leg_Raca = "Preta"
df[df$leg_Raca==3,]$leg_Raca = "Amarela"
df[df$leg_Raca==4,]$leg_Raca = "Parda"
df[df$leg_Raca==5,]$leg_Raca = "Indígena"
df[df$leg_Raca==9,]$leg_Raca = "Ignorado"

#ATUALIZA A FACTOR
df$leg_Raca = factor(df$leg_Raca)

#CS_SEXO

#DUPLICANDO COLUNA SEXO
df["leg_Sexo"]= df$CS_SEXO

#altera a leg_Sexo para string
df$leg_Sexo = as.character(df$leg_Sexo)

#SUBSTITUI VALORES leg_Sexo
#M-Masculino
#F-Feminino
#I-Ignorado
df[df$leg_Sexo== "I",]$leg_Sexo = "Ignorado"
df[df$leg_Sexo== "F",]$leg_Sexo = "Feminino"
df[df$leg_Sexo== "M",]$leg_Sexo = "Masculino"

#altera a leg_Sexo para factor
df$leg_Sexo = factor(df$leg_Sexo)

#NOSOCOMIAL - infecção adquirida após internação
#1-Sim
#2-Não
#9-Ignorado
df[is.na(df$NOSOCOMIAL),]$NOSOCOMIAL = 9 
#summary(df$NOSOCOMIAL)
#df[is.na(df$NOSOCOMIAL),]$NOSOCOMIAL

#EVOLUCAO
#1-Cura
#2-Óbito
#3-Óbito por outras causas
#9-Ignorado
df[is.na(df$EVOLUCAO),]$EVOLUCAO = 9
df[df$TP_IDADE==1|df$TP_IDADE==2,]$NU_IDADE_N = 0
#TP_IDADE
#1-Dia
#2-Mês
#3-Ano
#df["leg_Idade"] = df$TP_IDADE
#summary(df$leg_Idade)
#head(df)
#df$leg_Idade = factor(df$leg_Idade)

#leg_Idade
#TRANSFOMANDO O leg_Idade 
#1-Dia
#2-Mês
#3-Ano
#df[df$leg_Idade==1,]$leg_Idade = "Dia"
#df[df$leg_Idade==2,]$leg_Idade = "Mes"
#df[df$leg_Idade==3,]$leg_Idade = "Ano"
#df$leg_Idade = factor(df$leg_Idade)

#IDADE
#df[df$NU_IDADE_N<0,]$NU_IDADE_N
#boxplot(df$NU_IDADE_N, outline = FALSE)
boxplot(df$NU_IDADE_N, outline = TRUE)

#head(df)

#leg_Evolucao
df["leg_Evolucao"] = df$EVOLUCAO
#leg_Evolucao
#1-Cura
#2-Óbito
#3- Óbito por outras causas
#9-Ignorado
df[df$leg_Evolucao==1,]$leg_Evolucao = "Curado"
df[df$leg_Evolucao==2,]$leg_Evolucao = "Óbito"
df[df$leg_Evolucao==3,]$leg_Evolucao = "Óbito por outras causas"
df[df$leg_Evolucao==9,]$leg_Evolucao = "Ignorado"

df$leg_Evolucao = factor(df$leg_Evolucao)

#df[is.na(df),]
summary(df)
      DT_NOTIFIC       SEM_NOT           DT_SIN_PRI       SEM_PRI        SG_UF_NOT    
 18/05/2020:  238   Min.   : 1.00   01/05/2020:  287   Min.   : 1.00   SP     :11641  
 20/07/2020:  238   1st Qu.:21.00   01/07/2020:  245   1st Qu.:21.00   RJ     : 3943  
 15/06/2020:  224   Median :30.00   01/01/2021:  243   Median :30.00   MG     : 3680  
 29/06/2020:  221   Mean   :30.99   01/06/2020:  236   Mean   :31.71   PR     : 2218  
 14/12/2020:  220   3rd Qu.:41.00   20/05/2020:  235   3rd Qu.:42.00   PE     : 1925  
 04/05/2020:  218   Max.   :53.00   20/04/2020:  232   Max.   :53.00   RS     : 1917  
 (Other)   :37134                   (Other)   :37015                   (Other):13169  
          ID_MUNICIP    CS_SEXO     NU_IDADE_N        TP_IDADE        CS_RACA     
 SAO PAULO     : 4645   F:17761   Min.   :  0.00   Min.   :1.000   Min.   :1.000  
 RIO DE JANEIRO: 2064   I:    9   1st Qu.: 43.00   1st Qu.:3.000   1st Qu.:1.000  
 RECIFE        : 1213   M:20723   Median : 60.00   Median :3.000   Median :4.000  
 BELO HORIZONTE: 1091             Mean   : 56.56   Mean   :2.977   Mean   :3.798  
 FORTALEZA     :  923             3rd Qu.: 74.00   3rd Qu.:3.000   3rd Qu.:4.000  
 BRASILIA      :  860             Max.   :138.00   Max.   :3.000   Max.   :9.000  
 (Other)       :27697                                                             
   ID_PAIS        NOSOCOMIAL    FATOR_RISC    EVOLUCAO         leg_Raca          leg_Sexo    
 BRASIL:38493   Min.   :1.000   N:14193    Min.   :1.000   Amarela :  425   Feminino :17761  
                1st Qu.:2.000   S:24300    1st Qu.:1.000   Branca  :14713   Ignorado :    9  
                Median :2.000              Median :1.000   Ignorado: 8074   Masculino:20723  
                Mean   :4.059              Mean   :2.035   Indígena:  100                    
                3rd Qu.:9.000              3rd Qu.:2.000   Parda   :13335                    
                Max.   :9.000              Max.   :9.000   Preta   : 1846                    
                                                                                             
                  leg_Evolucao  
 Curado                 :24345  
 Ignorado               : 3599  
 Óbito                  :10054  
 Óbito por outras causas:  495  
                                
                                
                                
boxplot(df$NU_IDADE_N, outline = TRUE)

#brincando com datas

#head(df)
#df["DataNotificacao"] = df$DT_NOTIFIC
#df = df[,!(names(df)%in% "DataNotificação")]
#confirmando a classe
#class(df$DataNotificacao)
#df$DataNotificacao = as.Date(df$DataNotificacao)
#class(df$DataNotificacao)
unclass(class(df$DataNotificacao))
[1] "NULL"

#SERIE TEMPORAL 1 anual 4 trimestral 12 mensal 52 semana

df_stp = ts(df, 
            start = c(2020,1),
            end= c(2022,12),
            frequency = 12
            )
plot(df_stp[,1:10])

plot(df_stp[,11:15])

plot(df_stp[,16:17])

teste = df_stp[,"SEM_NOT"]
plot(teste)

library(forecast)
Warning: package ‘forecast’ was built under R version 4.1.3This is forecast 8.18 
  Want to stay up-to-date? Read the Hyndsight blog:
  https://robjhyndman.com/hyndsight/
autoplot(df_stp[,"EVOLUCAO"])

dim(df_stp)
[1] 36 17
cor(df_stp[,"EVOLUCAO"], df_stp[,"NU_IDADE_N"])
[1] -0.01171499

#GERANDO AMOSTRA DOS DADOS

dim(df)
[1] 38493    17
set.seed(2245)
amostra = sample(c(0,1),38493, replace = TRUE, prob=c(0.7, 0.3))
summary(as.factor(amostra))
    0     1 
26900 11593 
amostradf = df[amostra==1,]
dim(amostradf)
[1] 11593    17
#teste de normalidade
#grafico de normalidade
qqnorm(df$NU_IDADE_N)
qqline(df$NU_IDADE_N)

shapiro.test(df$NU_IDADE_N[0:5000])

    Shapiro-Wilk normality test

data:  df$NU_IDADE_N[0:5000]
W = 0.96116, p-value < 2.2e-16
#VALOR P ACIMA DE 0,05 NÃO HÁ INDICIO DE CONFIMAÇÃO DE HIPOTESE NULA
#p-value < 2.2e-16
#HISTOGRAMA COM LINHA DE DENSIDADE
#hist(df$NU_IDADE, main = "")
hist(df$SEM_PRI, main = "")
par(new=TRUE)
plot(density(df$SEM_PRI), xlab = "", ylab = "", axes=F, lwd=2.5)

#grafico de normalidade
qqnorm(df$SEM_PRI)
qqline(df$SEM_PRI)

```r
idade = ggplot(df, aes(y = NU_IDADE_N, 
                       x = leg_Idade,
                       fill = leg_Idade)
               )+
              geom_boxplot(outlier.colour = \red\#,
                           #outlier.shape = 1
                           )+
              theme_classic(base_size = 18)+
              xlab(\Grupo\) + 
              ylab(\Idade\)
idade
ggplotly(idade)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

#regressao linear

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuI3ZhcmlhdmVsIHhcbiNkZiROVV9JREFERV9OXG4jZWl4b3kgdmFyaWEgZGUgcmVzcG9zdGFcbiNkZiRFVk9MVUNBT1xubW9kZWxvID0gbG0oRVZPTFVDQU9+ZGYkU0VNX1BSSSwgZGF0YT1kZilcbmxpYnJhcnkoY29ycmdyYW0pXG5gYGAifQ== -->

```r
#variavel x
#df$NU_IDADE_N
#eixoy varia de resposta
#df$EVOLUCAO
modelo = lm(EVOLUCAO~df$SEM_PRI, data=df)
library(corrgram)
Warning: package ‘corrgram’ was built under R version 4.1.3
Attaching package: ‘corrgram’

The following object is masked from ‘package:lattice’:

    panel.fill
modelo

Call:
lm(formula = EVOLUCAO ~ df$SEM_PRI, data = df)

Coefficients:
(Intercept)   df$SEM_PRI  
   1.785518     0.007865  
plot(SEM_PRI~EVOLUCAO, data=df, 
     xlab="idade", ylab = "evolucao", 
     main="teste")
abline(modelo)

#IDADE

#summary(df$NU_IDADE_N)
#df[df$NU_IDADE_N>106,]$NU_IDADE_N
#df[df$NU_IDADE_N<0,]$NU_IDADE_N
boxplot(df$NU_IDADE_N, outline = FALSE)

boxplot(df$NU_IDADE_N, outline = TRUE)

#head(df)
idade = ggplot(df, aes(y = NU_IDADE_N, 
                       x = leg_Idade,
                       fill = leg_Idade)
               )+
              geom_boxplot(outlier.colour = "red"#,
                           #outlier.shape = 1
                           )+
              theme_classic(base_size = 18)+
              xlab("Grupo") + 
              ylab("Idade")
idade
Error in FUN(X[[i]], ...) : object 'leg_Idade' not found

#GRAFICOS EXPLORATORIOS #GRAFICO TOTALIZADORES #- ETNIA

etnia1 = ggplot(df, aes(x = leg_Raca)
                     )+
                    geom_bar(color ='white',
                             fill = 'blue'
                             )+
                    xlab("Etnia"
                         )+
                    ylab("Totalizador")+
                    #scale_x_continuous(labels = comma)+
                    #scale_y_continuous(labels = comma)+
                    #scale_x_continuous(labels = comma_format(big.mark = ".",
                    #                                         decimal.mark = ",")
                    #                   )+
                    scale_y_continuous(labels = comma_format(big.mark = ".",
                                                             decimal.mark = ",")
                                       )+
                    ggtitle("Titulo: Grupo Etnico")

ggplotly(etnia1)
NA
#HISTOGRAMA para ESTUDO POSTERIOR
etnia2 = ggplot(df,aes(x = CS_RACA)
                    )+
                    geom_histogram(color ='black',
                                   fill = 'blue',
                                   bins = 30,
                                   binwidth = 1
                                   )+
                    stat_bin(aes(y=..count..,label=..count..),
                             geom="text", vjust=1
                             )+ 
                    theme_classic(base_size = 10
                                  )+
                    xlab("Grupo Etnico"
                         )+
                    ylab("Total")+
                    ggtitle("Titulo: Grupo Etnico")

ggplotly(etnia2)
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

#GRAFICO TOTALIZADOR - Leg Sexo

sexo1 = ggplot(df, aes(x = leg_Sexo)
                     )+
                    geom_bar(color ='white',
                             fill = 'blue'
                             )+
                    xlab("Etnia"
                         )+
                    ylab("Totalizador")+
                    #scale_x_continuous(labels = comma)+
                    #scale_y_continuous(labels = comma)+
                    #scale_x_continuous(labels = comma_format(big.mark = ".",
                    #                                         decimal.mark = ",")
                    #                   )+
                    scale_y_continuous(labels = comma_format(big.mark = ".",
                                                             decimal.mark = ",")
                                       )+
                    ggtitle("Titulo: Sexo")

ggplotly(sexo1)
idade = ggplot(df, aes(y = NU_IDADE_N, 
                       x = leg_Idade,
                       fill = leg_Idade)
               )+
              geom_boxplot(outlier.colour = "red"#,
                           #outlier.shape = 1
                           )+
              theme_classic(base_size = 18)+
              xlab("Grupo") + 
              ylab("Idade")
idade
ggplotly(idade)

#nova base a para estudo IMPORTAÇÃO DOS DADOS

REFERENCIA MULDIAL https://github.com/owid/covid-19-data/tree/master/public/data

#importa dados, string vazio como NA, string como fatores
#arquivo = file.choose()
#arquivo ="C:\\Users\\Papai\\Google Drive\\5.Projetos\\R\\Covid\\owid-covid-data.csv"
#dados = read.csv(arquivo,
#                 sep = ",",
#                 na.strings="",
#                 stringsAsFactors=T)
#TOTAL DE LINHAS/ COLUNAS: 226113 / 67
#dim(dados)
#head(dados)
#colnames(dados)
LS0tDQp0aXRsZTogIkVTVFVETyBETyBDT1ZJRCINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQojUkVGRVJFTkNJQSBEQSBCQVNFIERPUyBEQURPUw0KaHR0cHM6Ly9vcGVuZGF0YXN1cy5zYXVkZS5nb3YuYnIvZGF0YXNldC9zcmFnLTIwMjANCg0KI0RBVEEgREEgVUxUSU1BIEFUVUxJWkHDh8ODTyA6IDI5LzExLzIwMjINCi1BUlFVSVZPIC0tPiBTVUJTVElUVUlSIEFSUSBQRUxPIE1BSVMgUkVDRU5URQ0KLVJFT1JHQU5JWkFSIE9TIEdSQUZJQ09TIEUgU0VSSUVTDQoNCg0KI0JJQkxJT1RFQ0FTDQpgYGB7cn0NCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeShsYXR0aWNlKQ0KYGBgDQoNCg0KYGBge3J9DQojaW1wb3J0YSBkYWRvcywgc3RyaW5nIHZhemlvIGNvbW8gTkEsIHN0cmluZyBjb21vIGZhdG9yZXMNCiNhcnF1aXZvID0gZmlsZS5jaG9vc2UoKQ0KZGYgPSByZWFkLmNzdigiSU5GTFVEMjAtMTctMTAtMjAyMlJlZHV6aWRvLmNzdiIsDQogICAgICAgICAgICAgICAgIHNlcCA9ICI7IiwNCiAgICAgICAgICAgICAgICAgbmEuc3RyaW5ncz0iIiwNCiAgICAgICAgICAgICAgICAgc3RyaW5nc0FzRmFjdG9ycz1UUlVFKQ0KDQpgYGANCg0KDQpgYGB7cn0NCiNBTkFMSVNBTkRPIEEgQkFTRSBERSBEQURPUw0KI0VYQ0xVSU5ETyBDT0xVTkFTIERFU05FQ0VTU0FSSUFTIFBBUkEgQU5BTElTRQ0KZXhjbHVpcl9jb2wgPC0gYygiSURfUkVHSU9OQSIsICJDT19SRUdJT05BIiwgIkNPX01VTl9OT1QiLCAiQ09fVU5JX05PVCIsICJOTV9NQUVfUEFDIiwNCiAgICAgICAgICAgICAgICAgIkNPX01VTl9SRVMiLCAiQ09fUEFJUyIsICJJRF9SR19SRVNJIiwgIkNPX1JHX1JFU0kiLA0KICAgICAgICAgICAgICAgICAiQVZFX1NVSU5PIiwgIkZFQlJFIiwgIlRPU1NFIiwgIkdBUkdBTlRBIiwgIkRJU1BORUlBIiwgIkRJQVJSRUlBIiwgIlZPTUlUTyIsDQogICAgICAgICAgICAgICAgICJERVNDX1JFU1AiLCAiU0FUVVJBQ0FPIiwgIk9VVFJPX1NJTiIsICJPVVRST19ERVMiLCAiUFVFUlBFUkEiLCAiQ0FSRElPUEFUSSIsDQogICAgICAgICAgICAgICAgICJIRU1BVE9MT0dJIiwiRElBQkVURVMiLCAiTkVVUk9MT0dJQyIsICJQTkVVTU9QQVRJIiwgIlJFTkFMIiwgIk9VVF9NT1JCSSIsDQogICAgICAgICAgICAgICAgICJTSU5EX0RPV04iLCAiSEVQQVRJQ0EiLCAiQVNNQSIsICJJTVVOT0RFUFJFIiwgIk9CRVNJREFERSIsICJPQkVTX0lNQyIsDQogICAgICAgICAgICAgICAgICJNT1JCX0RFU0MiLCAiVkFDSU5BIiwgIkRUX1VUX0RPU0UiLCAiTUFFX1ZBQyIsICJEVF9WQUNfTUFFIiwgIk1fQU1BTUVOVEEiLA0KICAgICAgICAgICAgICAgICAiRFRfRE9TRVVOSSIsICJEVF8xX0RPU0UiLCAiRFRfMl9ET1NFIiwgIkFOVElWSVJBTCIsICJUUF9BTlRJVklSIiwgIk9VVF9BTlRJViIsDQogICAgICAgICAgICAgICAgICJEVF9BTlRJVklSIiwgIklEX1JHX0lOVEUiLCAiQ09fUkdfSU5URSIsICJTR19VRl9JTlRFIiwgIklEX01OX0lOVEUiLCANCiAgICAgICAgICAgICAgICAgIkNPX01VX0lOVEUiLCAiRFRfU0FJRFVUSSIsICJTVVBPUlRfVkVOIiwgIlJBSU9YX1JFUyIsICJSQUlPWF9PVVQiLCAiRFRfUkFJT1giLA0KICAgICAgICAgICAgICAgICAiQU1PU1RSQSIsICJEVF9DT0xFVEEiLCAiVFBfQU1PU1RSQSIsICJPVVRfQU1PU1QiLCAiRFRfRU5UVVRJIiwgIlBDUl9SRVNVTCIsDQogICAgICAgICAgICAgICAgICJEVF9QQ1IiLCAiUE9TX1BDUkZMVSIsIlRQX0ZMVV9QQ1IiLCAiUENSX0ZMVUFTVSIsICJGTFVBU1VfT1VUIiwiUENSX0ZMVUJMSSIsDQogICAgICAgICAgICAgICAgICJGTFVCTElfT1VUIiwgIlBPU19QQ1JPVVQiLCAiUENSX1ZTUiIsICJQQ1JfUEFSQTEiLCAiUENSX1BBUkEyIiwgIlBDUl9QQVJBMyIsDQogICAgICAgICAgICAgICAgICJQQ1JfUEFSQTQiLCAiUENSX0FERU5PIiwgIlBDUl9NRVRBUCIsICJQQ1JfQk9DQSIsICJQQ1JfUklOTyIsICJQQ1JfT1VUUk8iLA0KICAgICAgICAgICAgICAgICAiRFNfUENSX09VVCIsICJDTEFTU0lfRklOIiwgIkNMQVNTSV9PVVQiLCJDUklURVJJTyIsICJEVF9FTkNFUlJBIiwgIkRUX0RJR0lUQSIsDQogICAgICAgICAgICAgICAgICJQQ1JfU0FSUzIiLCAiUEFDX0NPQ0JPIiwgIlBBQ19EU0NCTyIsICJPVVRfQU5JTSIsICJET1JfQUJEIiwgIkZBRElHQSIsDQogICAgICAgICAgICAgICAgICJQRVJEX09MRlQiLCAiUEVSRF9QQUxBIiwgIlRPTU9fUkVTIiwgIkRUX1RPTU8iLCAiRFRfUkVTX0FOIiwgIlBPU19BTl9GTFUiLA0KICAgICAgICAgICAgICAgICAiVFBfRkxVX0FOIiwgIlBPU19BTl9PVVQiLCAiQU5fU0FSUzIiLCAiQU5fVlNSIiwgIkFOX1BBUkExIiwgIkFOX1BBUkEyIiwNCiAgICAgICAgICAgICAgICAgIkFOX1BBUkEzIiwgIkFOX0FERU5PIiwgIkFOX09VVFJPIiwgIkRTX0FOX09VVCIsICJUUF9BTV9TT1IiLCAiU09SX09VVCIsDQogICAgICAgICAgICAgICAgICJUT01PX09VVCIsICJSRVNfQU4iLCAiRFRfQ09fU09SIiwgIlRQX1NPUiIsICJPVVRfU09SIiwgIkRUX1JFUyIsICJSRVNfSUdHIiwNCiAgICAgICAgICAgICAgICAgIlJFU19JR00iLCAiUkVTX0lHQSIsICJDT0RfSURBREUiLCAiQ1NfRVNDT0xfTiIsICJDU19HRVNUQU5UIiwgIlRQX1RFU19BTiIsDQogICAgICAgICAgICAgICAgICJDU19aT05BIiwgIlNVUlRPX1NHIiwgIkRUX1JUX1ZHTSIsICJEVF9WR00iLCAiUEFJU19WR00iLCAiQ09fUFNfVkdNIiwNCiAgICAgICAgICAgICAgICAgIkxPX1BTX1ZHTSIsICJISVNUT19WR00iLCAiU0dfVUYiLCAiRFRfTkFTQyIsICJJRF9VTklEQURFIiwgIklEX01OX1JFU0kiLCJVVEkiLA0KICAgICAgICAgICAgICAgICAiSE9TUElUQUwiLCJEVF9JTlRFUk5BIiwgIkRUX0VWT0xVQ0EiDQogICAgICAgICAgICAgICAgICkNCmRmID0gZGZbLCEobmFtZXMoZGYpJWluJSBleGNsdWlyX2NvbCldDQoNCiNSQUNBDQojTkEncyA9IDktSWdub3JhZG8NCmRmW2lzLm5hKGRmJENTX1JBQ0EpLF0kQ1NfUkFDQSA9IDkgDQoNCiNMRUdfUkFDQQ0KI0RVUExJQ0FORE8gQ09MVU5BIFJBQ0ENCmRmWyJsZWdfUmFjYSJdPSBkZiRDU19SQUNBDQoNCiNTVUJTVElUVUkgVkFMT1JFUw0KZGZbZGYkbGVnX1JhY2E9PTEsXSRsZWdfUmFjYSA9ICJCcmFuY2EiDQpkZltkZiRsZWdfUmFjYT09MixdJGxlZ19SYWNhID0gIlByZXRhIg0KZGZbZGYkbGVnX1JhY2E9PTMsXSRsZWdfUmFjYSA9ICJBbWFyZWxhIg0KZGZbZGYkbGVnX1JhY2E9PTQsXSRsZWdfUmFjYSA9ICJQYXJkYSINCmRmW2RmJGxlZ19SYWNhPT01LF0kbGVnX1JhY2EgPSAiSW5kw61nZW5hIg0KZGZbZGYkbGVnX1JhY2E9PTksXSRsZWdfUmFjYSA9ICJJZ25vcmFkbyINCg0KI0FUVUFMSVpBIEEgRkFDVE9SDQpkZiRsZWdfUmFjYSA9IGZhY3RvcihkZiRsZWdfUmFjYSkNCg0KI0NTX1NFWE8NCg0KI0RVUExJQ0FORE8gQ09MVU5BIFNFWE8NCmRmWyJsZWdfU2V4byJdPSBkZiRDU19TRVhPDQoNCiNhbHRlcmEgYSBsZWdfU2V4byBwYXJhIHN0cmluZw0KZGYkbGVnX1NleG8gPSBhcy5jaGFyYWN0ZXIoZGYkbGVnX1NleG8pDQoNCiNTVUJTVElUVUkgVkFMT1JFUyBsZWdfU2V4bw0KI00tTWFzY3VsaW5vDQojRi1GZW1pbmlubw0KI0ktSWdub3JhZG8NCmRmW2RmJGxlZ19TZXhvPT0gIkkiLF0kbGVnX1NleG8gPSAiSWdub3JhZG8iDQpkZltkZiRsZWdfU2V4bz09ICJGIixdJGxlZ19TZXhvID0gIkZlbWluaW5vIg0KZGZbZGYkbGVnX1NleG89PSAiTSIsXSRsZWdfU2V4byA9ICJNYXNjdWxpbm8iDQoNCiNhbHRlcmEgYSBsZWdfU2V4byBwYXJhIGZhY3Rvcg0KZGYkbGVnX1NleG8gPSBmYWN0b3IoZGYkbGVnX1NleG8pDQoNCiNOT1NPQ09NSUFMIC0gaW5mZWPDp8OjbyBhZHF1aXJpZGEgYXDDs3MgaW50ZXJuYcOnw6NvDQojMS1TaW0NCiMyLU7Do28NCiM5LUlnbm9yYWRvDQpkZltpcy5uYShkZiROT1NPQ09NSUFMKSxdJE5PU09DT01JQUwgPSA5IA0KI3N1bW1hcnkoZGYkTk9TT0NPTUlBTCkNCiNkZltpcy5uYShkZiROT1NPQ09NSUFMKSxdJE5PU09DT01JQUwNCg0KI0VWT0xVQ0FPDQojMS1DdXJhDQojMi3Dk2JpdG8NCiMzLcOTYml0byBwb3Igb3V0cmFzIGNhdXNhcw0KIzktSWdub3JhZG8NCmRmW2lzLm5hKGRmJEVWT0xVQ0FPKSxdJEVWT0xVQ0FPID0gOQ0KYGBgDQoNCmBgYHtyfQ0KZGZbZGYkVFBfSURBREU9PTF8ZGYkVFBfSURBREU9PTIsXSROVV9JREFERV9OID0gMA0KYGBgDQoNCg0KYGBge3J9DQojVFBfSURBREUNCiMxLURpYQ0KIzItTcOqcw0KIzMtQW5vDQojZGZbImxlZ19JZGFkZSJdID0gZGYkVFBfSURBREUNCiNzdW1tYXJ5KGRmJGxlZ19JZGFkZSkNCiNoZWFkKGRmKQ0KI2RmJGxlZ19JZGFkZSA9IGZhY3RvcihkZiRsZWdfSWRhZGUpDQoNCiNsZWdfSWRhZGUNCiNUUkFOU0ZPTUFORE8gTyBsZWdfSWRhZGUgDQojMS1EaWENCiMyLU3DqnMNCiMzLUFubw0KI2RmW2RmJGxlZ19JZGFkZT09MSxdJGxlZ19JZGFkZSA9ICJEaWEiDQojZGZbZGYkbGVnX0lkYWRlPT0yLF0kbGVnX0lkYWRlID0gIk1lcyINCiNkZltkZiRsZWdfSWRhZGU9PTMsXSRsZWdfSWRhZGUgPSAiQW5vIg0KI2RmJGxlZ19JZGFkZSA9IGZhY3RvcihkZiRsZWdfSWRhZGUpDQoNCiNJREFERQ0KI2RmW2RmJE5VX0lEQURFX048MCxdJE5VX0lEQURFX04NCiNib3hwbG90KGRmJE5VX0lEQURFX04sIG91dGxpbmUgPSBGQUxTRSkNCmJveHBsb3QoZGYkTlVfSURBREVfTiwgb3V0bGluZSA9IFRSVUUpDQojaGVhZChkZikNCg0KI2xlZ19Fdm9sdWNhbw0KZGZbImxlZ19Fdm9sdWNhbyJdID0gZGYkRVZPTFVDQU8NCiNsZWdfRXZvbHVjYW8NCiMxLUN1cmENCiMyLcOTYml0bw0KIzMtIMOTYml0byBwb3Igb3V0cmFzIGNhdXNhcw0KIzktSWdub3JhZG8NCmRmW2RmJGxlZ19Fdm9sdWNhbz09MSxdJGxlZ19Fdm9sdWNhbyA9ICJDdXJhZG8iDQpkZltkZiRsZWdfRXZvbHVjYW89PTIsXSRsZWdfRXZvbHVjYW8gPSAiw5NiaXRvIg0KZGZbZGYkbGVnX0V2b2x1Y2FvPT0zLF0kbGVnX0V2b2x1Y2FvID0gIsOTYml0byBwb3Igb3V0cmFzIGNhdXNhcyINCmRmW2RmJGxlZ19Fdm9sdWNhbz09OSxdJGxlZ19Fdm9sdWNhbyA9ICJJZ25vcmFkbyINCg0KZGYkbGVnX0V2b2x1Y2FvID0gZmFjdG9yKGRmJGxlZ19Fdm9sdWNhbykNCmBgYA0KDQpgYGB7cn0NCg0KI2RmW2lzLm5hKGRmKSxdDQpzdW1tYXJ5KGRmKQ0KYm94cGxvdChkZiROVV9JREFERV9OLCBvdXRsaW5lID0gVFJVRSkNCmBgYA0KI2JyaW5jYW5kbyBjb20gZGF0YXMNCmBgYHtyfQ0KI2hlYWQoZGYpDQojZGZbIkRhdGFOb3RpZmljYWNhbyJdID0gZGYkRFRfTk9USUZJQw0KI2RmID0gZGZbLCEobmFtZXMoZGYpJWluJSAiRGF0YU5vdGlmaWNhw6fDo28iKV0NCiNjb25maXJtYW5kbyBhIGNsYXNzZQ0KI2NsYXNzKGRmJERhdGFOb3RpZmljYWNhbykNCiNkZiREYXRhTm90aWZpY2FjYW8gPSBhcy5EYXRlKGRmJERhdGFOb3RpZmljYWNhbykNCiNjbGFzcyhkZiREYXRhTm90aWZpY2FjYW8pDQp1bmNsYXNzKGNsYXNzKGRmJERhdGFOb3RpZmljYWNhbykpDQpgYGANCiNTRVJJRSBURU1QT1JBTA0KMSBhbnVhbA0KNCB0cmltZXN0cmFsDQoxMiBtZW5zYWwNCjUyIHNlbWFuYQ0KDQpgYGB7cn0NCmRmX3N0cCA9IHRzKGRmLCANCiAgICAgICAgICAgIHN0YXJ0ID0gYygyMDIwLDEpLA0KICAgICAgICAgICAgZW5kPSBjKDIwMjIsMTIpLA0KICAgICAgICAgICAgZnJlcXVlbmN5ID0gMTINCiAgICAgICAgICAgICkNCmBgYA0KDQpgYGB7cn0NCnBsb3QoZGZfc3RwWywxOjEwXSkNCnBsb3QoZGZfc3RwWywxMToxNV0pDQpwbG90KGRmX3N0cFssMTY6MTddKQ0KYGBgDQoNCg0KYGBge3J9DQp0ZXN0ZSA9IGRmX3N0cFssIlNFTV9OT1QiXQ0KcGxvdCh0ZXN0ZSkNCmBgYA0KDQoNCmBgYHtyfQ0KbGlicmFyeShmb3JlY2FzdCkNCmF1dG9wbG90KGRmX3N0cFssIkVWT0xVQ0FPIl0pDQoNCmBgYA0KDQpgYGB7cn0NCmRpbShkZl9zdHApDQpgYGANCg0KYGBge3J9DQpjb3IoZGZfc3RwWywiRVZPTFVDQU8iXSwgZGZfc3RwWywiTlVfSURBREVfTiJdKQ0KDQpgYGANCg0KDQoNCiNHRVJBTkRPIEFNT1NUUkEgRE9TIERBRE9TDQpgYGB7cn0NCmRpbShkZikNCmBgYA0KDQpgYGB7cn0NCnNldC5zZWVkKDIyNDUpDQphbW9zdHJhID0gc2FtcGxlKGMoMCwxKSwzODQ5MywgcmVwbGFjZSA9IFRSVUUsIHByb2I9YygwLjcsIDAuMykpDQpzdW1tYXJ5KGFzLmZhY3RvcihhbW9zdHJhKSkNCmBgYA0KDQpgYGB7cn0NCmFtb3N0cmFkZiA9IGRmW2Ftb3N0cmE9PTEsXQ0KZGltKGFtb3N0cmFkZikNCmBgYA0KDQoNCg0KYGBge3J9DQojdGVzdGUgZGUgbm9ybWFsaWRhZGUNCiNncmFmaWNvIGRlIG5vcm1hbGlkYWRlDQpxcW5vcm0oZGYkTlVfSURBREVfTikNCnFxbGluZShkZiROVV9JREFERV9OKQ0KDQpgYGANCg0KYGBge3J9DQpzaGFwaXJvLnRlc3QoZGYkTlVfSURBREVfTlswOjUwMDBdKQ0KI1ZBTE9SIFAgQUNJTUEgREUgMCwwNSBOw4NPIEjDgSBJTkRJQ0lPIERFIENPTkZJTUHDh8ODTyBERSBISVBPVEVTRSBOVUxBDQojcC12YWx1ZSA8IDIuMmUtMTYNCmBgYA0KDQpgYGB7cn0NCiNISVNUT0dSQU1BIENPTSBMSU5IQSBERSBERU5TSURBREUNCiNoaXN0KGRmJE5VX0lEQURFLCBtYWluID0gIiIpDQpoaXN0KGRmJFNFTV9QUkksIG1haW4gPSAiIikNCnBhcihuZXc9VFJVRSkNCnBsb3QoZGVuc2l0eShkZiRTRU1fUFJJKSwgeGxhYiA9ICIiLCB5bGFiID0gIiIsIGF4ZXM9RiwgbHdkPTIuNSkNCmBgYA0KDQpgYGB7cn0NCiNncmFmaWNvIGRlIG5vcm1hbGlkYWRlDQpxcW5vcm0oZGYkU0VNX1BSSSkNCnFxbGluZShkZiRTRU1fUFJJKQ0KYGBgDQoNCg0KYGBge3J9DQoNCiNkZltpcy5uYShkZiksXQ0Kc3VtbWFyeShkZikNCmBgYA0KI3JlZ3Jlc3NhbyBsaW5lYXINCmBgYHtyfQ0KI3ZhcmlhdmVsIHgNCiNkZiROVV9JREFERV9ODQojZWl4b3kgdmFyaWEgZGUgcmVzcG9zdGENCiNkZiRFVk9MVUNBTw0KbW9kZWxvID0gbG0oRVZPTFVDQU9+ZGYkU0VNX1BSSSwgZGF0YT1kZikNCmxpYnJhcnkoY29ycmdyYW0pDQpgYGANCg0KYGBge3J9DQptb2RlbG8NCmBgYA0KYGBge3J9DQpwbG90KFNFTV9QUkl+RVZPTFVDQU8sIGRhdGE9ZGYsIA0KICAgICB4bGFiPSJpZGFkZSIsIHlsYWIgPSAiZXZvbHVjYW8iLCANCiAgICAgbWFpbj0idGVzdGUiKQ0KYWJsaW5lKG1vZGVsbykNCmBgYA0KDQoNCg0KDQojSURBREUNCmBgYHtyfQ0KI3N1bW1hcnkoZGYkTlVfSURBREVfTikNCiNkZltkZiROVV9JREFERV9OPjEwNixdJE5VX0lEQURFX04NCiNkZltkZiROVV9JREFERV9OPDAsXSROVV9JREFERV9ODQpib3hwbG90KGRmJE5VX0lEQURFX04sIG91dGxpbmUgPSBGQUxTRSkNCmJveHBsb3QoZGYkTlVfSURBREVfTiwgb3V0bGluZSA9IFRSVUUpDQojaGVhZChkZikNCmBgYA0KDQpgYGB7cn0NCmlkYWRlID0gZ2dwbG90KGRmLCBhZXMoeSA9IE5VX0lEQURFX04sIA0KICAgICAgICAgICAgICAgICAgICAgICB4ID0gbGVnX0lkYWRlLA0KICAgICAgICAgICAgICAgICAgICAgICBmaWxsID0gbGVnX0lkYWRlKQ0KICAgICAgICAgICAgICAgKSsNCiAgICAgICAgICAgICAgZ2VvbV9ib3hwbG90KG91dGxpZXIuY29sb3VyID0gInJlZCIjLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgI291dGxpZXIuc2hhcGUgPSAxDQogICAgICAgICAgICAgICAgICAgICAgICAgICApKw0KICAgICAgICAgICAgICB0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZSA9IDE4KSsNCiAgICAgICAgICAgICAgeGxhYigiR3J1cG8iKSArIA0KICAgICAgICAgICAgICB5bGFiKCJJZGFkZSIpDQppZGFkZQ0KZ2dwbG90bHkoaWRhZGUpDQpgYGANCg0KDQoNCg0KDQoNCiNHUkFGSUNPUyBFWFBMT1JBVE9SSU9TDQojR1JBRklDTyBUT1RBTElaQURPUkVTDQojLSBFVE5JQQ0KYGBge3J9DQpldG5pYTEgPSBnZ3Bsb3QoZGYsIGFlcyh4ID0gbGVnX1JhY2EpDQogICAgICAgICAgICAgICAgICAgICApKw0KICAgICAgICAgICAgICAgICAgICBnZW9tX2Jhcihjb2xvciA9J3doaXRlJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbCA9ICdibHVlJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKw0KICAgICAgICAgICAgICAgICAgICB4bGFiKCJFdG5pYSINCiAgICAgICAgICAgICAgICAgICAgICAgICApKw0KICAgICAgICAgICAgICAgICAgICB5bGFiKCJUb3RhbGl6YWRvciIpKw0KICAgICAgICAgICAgICAgICAgICAjc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSsNCiAgICAgICAgICAgICAgICAgICAgI3NjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkrDQogICAgICAgICAgICAgICAgICAgICNzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWFfZm9ybWF0KGJpZy5tYXJrID0gIi4iLA0KICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNpbWFsLm1hcmsgPSAiLCIpDQogICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgKSsNCiAgICAgICAgICAgICAgICAgICAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hX2Zvcm1hdChiaWcubWFyayA9ICIuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNpbWFsLm1hcmsgPSAiLCIpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKw0KICAgICAgICAgICAgICAgICAgICBnZ3RpdGxlKCJUaXR1bG86IEdydXBvIEV0bmljbyIpDQoNCmdncGxvdGx5KGV0bmlhMSkNCg0KYGBgDQoNCmBgYHtyfQ0KI0hJU1RPR1JBTUEgcGFyYSBFU1RVRE8gUE9TVEVSSU9SDQpldG5pYTIgPSBnZ3Bsb3QoZGYsYWVzKHggPSBDU19SQUNBKQ0KICAgICAgICAgICAgICAgICAgICApKw0KICAgICAgICAgICAgICAgICAgICBnZW9tX2hpc3RvZ3JhbShjb2xvciA9J2JsYWNrJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbCA9ICdibHVlJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlucyA9IDMwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW53aWR0aCA9IDENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSsNCiAgICAgICAgICAgICAgICAgICAgc3RhdF9iaW4oYWVzKHk9Li5jb3VudC4uLGxhYmVsPS4uY291bnQuLiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb209InRleHQiLCB2anVzdD0xDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICkrIA0KICAgICAgICAgICAgICAgICAgICB0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZSA9IDEwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSsNCiAgICAgICAgICAgICAgICAgICAgeGxhYigiR3J1cG8gRXRuaWNvIg0KICAgICAgICAgICAgICAgICAgICAgICAgICkrDQogICAgICAgICAgICAgICAgICAgIHlsYWIoIlRvdGFsIikrDQogICAgICAgICAgICAgICAgICAgIGdndGl0bGUoIlRpdHVsbzogR3J1cG8gRXRuaWNvIikNCg0KZ2dwbG90bHkoZXRuaWEyKQ0KYGBgDQoNCiNHUkFGSUNPIFRPVEFMSVpBRE9SIC0gTGVnIFNleG8NCmBgYHtyfQ0Kc2V4bzEgPSBnZ3Bsb3QoZGYsIGFlcyh4ID0gbGVnX1NleG8pDQogICAgICAgICAgICAgICAgICAgICApKw0KICAgICAgICAgICAgICAgICAgICBnZW9tX2Jhcihjb2xvciA9J3doaXRlJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbCA9ICdibHVlJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKw0KICAgICAgICAgICAgICAgICAgICB4bGFiKCJFdG5pYSINCiAgICAgICAgICAgICAgICAgICAgICAgICApKw0KICAgICAgICAgICAgICAgICAgICB5bGFiKCJUb3RhbGl6YWRvciIpKw0KICAgICAgICAgICAgICAgICAgICAjc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSsNCiAgICAgICAgICAgICAgICAgICAgI3NjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkrDQogICAgICAgICAgICAgICAgICAgICNzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWFfZm9ybWF0KGJpZy5tYXJrID0gIi4iLA0KICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNpbWFsLm1hcmsgPSAiLCIpDQogICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgKSsNCiAgICAgICAgICAgICAgICAgICAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hX2Zvcm1hdChiaWcubWFyayA9ICIuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNpbWFsLm1hcmsgPSAiLCIpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKw0KICAgICAgICAgICAgICAgICAgICBnZ3RpdGxlKCJUaXR1bG86IFNleG8iKQ0KDQpnZ3Bsb3RseShzZXhvMSkNCmBgYA0KDQpgYGB7cn0NCmlkYWRlID0gZ2dwbG90KGRmLCBhZXMoeSA9IE5VX0lEQURFX04sIA0KICAgICAgICAgICAgICAgICAgICAgICB4ID0gbGVnX0lkYWRlLA0KICAgICAgICAgICAgICAgICAgICAgICBmaWxsID0gbGVnX0lkYWRlKQ0KICAgICAgICAgICAgICAgKSsNCiAgICAgICAgICAgICAgZ2VvbV9ib3hwbG90KG91dGxpZXIuY29sb3VyID0gInJlZCIjLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgI291dGxpZXIuc2hhcGUgPSAxDQogICAgICAgICAgICAgICAgICAgICAgICAgICApKw0KICAgICAgICAgICAgICB0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZSA9IDE4KSsNCiAgICAgICAgICAgICAgeGxhYigiR3J1cG8iKSArIA0KICAgICAgICAgICAgICB5bGFiKCJJZGFkZSIpDQppZGFkZQ0KZ2dwbG90bHkoaWRhZGUpDQpgYGANCg0KI25vdmEgYmFzZSBhIHBhcmEgZXN0dWRvDQpJTVBPUlRBw4fDg08gRE9TIERBRE9TDQoNClJFRkVSRU5DSUEgTVVMRElBTA0KaHR0cHM6Ly9naXRodWIuY29tL293aWQvY292aWQtMTktZGF0YS90cmVlL21hc3Rlci9wdWJsaWMvZGF0YQ0KDQoNCmBgYHtyfQ0KI2ltcG9ydGEgZGFkb3MsIHN0cmluZyB2YXppbyBjb21vIE5BLCBzdHJpbmcgY29tbyBmYXRvcmVzDQojYXJxdWl2byA9IGZpbGUuY2hvb3NlKCkNCiNhcnF1aXZvID0iQzpcXFVzZXJzXFxQYXBhaVxcR29vZ2xlIERyaXZlXFw1LlByb2pldG9zXFxSXFxDb3ZpZFxcb3dpZC1jb3ZpZC1kYXRhLmNzdiINCiNkYWRvcyA9IHJlYWQuY3N2KGFycXVpdm8sDQojICAgICAgICAgICAgICAgICBzZXAgPSAiLCIsDQojICAgICAgICAgICAgICAgICBuYS5zdHJpbmdzPSIiLA0KIyAgICAgICAgICAgICAgICAgc3RyaW5nc0FzRmFjdG9ycz1UKQ0KI1RPVEFMIERFIExJTkhBUy8gQ09MVU5BUzogMjI2MTEzIC8gNjcNCiNkaW0oZGFkb3MpDQojaGVhZChkYWRvcykNCiNjb2xuYW1lcyhkYWRvcykNCg0KYGBgDQo=